"""
-------------------------------
- File_Name: __init__.py
- Date: 2025/2/12
- Author: yangzhide
- Email: xxzjyzd@126.com
- Description:
-------------------------------
"""

import os.path
from importlib import import_module
from pathlib import Path
from typing import List
from config import get_settings
from app.logging.config import log


# 获取环境变量,默认v1
setting = get_settings()
version = setting["version"]


def get_routers() -> List:
    """
    返回一个路由模块中相关主信息

    router: 路由对象
    tags: 标签列表
    tag_name: 标签名称
    description: 路由标签描述
    :return: 元组列表 [(router, tags, tag_name, description),...]
    """
    routers = []
    parent_path = Path(__file__).parent  # 当前文件的父目录
    target_path = parent_path / version  # 目标目录（如 v1）

    # 构造模块路径前缀
    module_path_prefix = f"app.api.{version}"

    # 递归遍历目标路径下的所有 .py 文件（排除 __init__.py 和 test.py）
    for file in target_path.rglob("*.py"):
        if file.name in ["__init__.py", "test.py"]:
            continue

        # 获取模块路径
        # 相对于 target_path 的路径（确保不会重复包含 version）
        relative_path = file.relative_to(target_path)
        module_name = relative_path.with_suffix("").as_posix().replace("/", ".")

        # 动态导入模块
        try:
            module = import_module(f"{module_path_prefix}.{module_name}")
        except ModuleNotFoundError as e:
            print(f"Error importing module {module_name}: {e}")
            continue

        # 获取路由对象和相关元数据
        router = getattr(module, "router", None)
        tags = getattr(module, "tags", ["未定义"])
        tag_name = tags[0]
        description = getattr(module, "description", None)

        if router:
            routers.append((router, tags, tag_name, description))

    return routers

def register_router(app):
    # 加载路由
    log.info("注册路由...")
    for router in get_routers():
        app.include_router(router[0], tags=router[1])

get_routers()
def get_tags_metadata():
    """
    返回一个路由模块的标签描述
    name: 标签名称
    description: 路由标签描述
    :return: 字典列表
    """
    routers = get_routers()
    # routers = [(router, tags, tag_name, description),...]
    tags_metadata = [{"name": router[2], "description": router[3]} for router in routers]
    return tags_metadata

